/**
* This file is part of JSkat.
*
* JSkat is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JSkat is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with JSkat. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jskat.gui.img;
import java.awt.Canvas;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jskat.data.JSkatOptions;
import org.jskat.util.Card;
import org.jskat.util.JSkatResourceBundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javafx.scene.image.ImageView;
/**
* Repository that holds all images used in JSkat
*/
public class JSkatGraphicRepository {
private static Logger log = LoggerFactory.getLogger(JSkatGraphicRepository.class);
public final static JSkatGraphicRepository INSTANCE = new JSkatGraphicRepository();
private static JSkatOptions options = JSkatOptions.instance();
private Image skatTable;
private Map<CardSet, Map<Card, Image>> cards;
private Map<CardSet, Image> cardBacks;
private List<List<Image>> awtIcons;
private Map<Icon, Map<IconSize, javafx.scene.image.Image>> icons;
private List<Image> flags;
private Image jskatLogo;
private List<Image> bidBubbles;
/**
* Creates a new instance of JSkatGraphicRepository
*/
private JSkatGraphicRepository() {
loadAllJSkatImages();
}
public void reloadAllJSkatImages() {
loadAllJSkatImages();
}
private void loadAllJSkatImages() {
final MediaTracker tracker = new MediaTracker(new Canvas());
loadImages(tracker);
log.debug("Bitmaps for JSkat logo and skat table loaded..."); //$NON-NLS-1$
this.awtIcons = new ArrayList<List<Image>>();
this.icons = new HashMap<>();
loadIcons(tracker);
log.debug("Bitmaps for icons loaded..."); //$NON-NLS-1$
this.cards = new HashMap<CardSet, Map<Card, Image>>();
this.cardBacks = new HashMap<CardSet, Image>();
loadCards(tracker);
log.debug("Bitmaps for cards loaded..."); //$NON-NLS-1$
this.flags = new ArrayList<>();
loadFlags(tracker);
log.debug("Bitmaps for flags loaded..."); //$NON-NLS-1$
}
private void loadFlags(final MediaTracker tracker) {
// for all flags
for (final Flag flag : Flag.values()) {
// add flag
this.flags.add(Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource("org/jskat/gui/img/gui/" //$NON-NLS-1$
+ "flag_" + flag.toString().toLowerCase() + ".png"))); //$NON-NLS-1$ //$NON-NLS-2$
tracker.addImage(this.flags.get(flag.ordinal()), 3);
}
try {
tracker.waitForID(3);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
private void loadImages(final MediaTracker tracker) {
this.skatTable = Toolkit.getDefaultToolkit()
.getImage(ClassLoader.getSystemResource("org/jskat/gui/img/gui/skat_table.png")); //$NON-NLS-1$
tracker.addImage(this.skatTable, 0);
this.jskatLogo = Toolkit.getDefaultToolkit()
.getImage(ClassLoader.getSystemResource("org/jskat/gui/img/gui/jskat_logo.png")); //$NON-NLS-1$
tracker.addImage(this.jskatLogo, 0);
this.bidBubbles = new ArrayList<>();
this.bidBubbles.add(Toolkit.getDefaultToolkit()
.getImage(ClassLoader.getSystemResource("org/jskat/gui/img/gui/bid_left.png"))); //$NON-NLS-1$
this.bidBubbles.add(Toolkit.getDefaultToolkit()
.getImage(ClassLoader.getSystemResource("org/jskat/gui/img/gui/bid_right.png"))); //$NON-NLS-1$
this.bidBubbles.add(Toolkit.getDefaultToolkit()
.getImage(ClassLoader.getSystemResource("org/jskat/gui/img/gui/bid_user.png"))); //$NON-NLS-1$
tracker.addImage(this.bidBubbles.get(0), 0);
tracker.addImage(this.bidBubbles.get(1), 0);
tracker.addImage(this.bidBubbles.get(2), 0);
try {
tracker.waitForID(0);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
/**
* Loads all icons
*/
private void loadIcons(final MediaTracker tracker) {
// for all icons
for (final Icon icon : Icon.values()) {
// new array list for all sizes
this.awtIcons.add(new ArrayList<>());
icons.put(icon, new HashMap<>());
// for all sizes
for (final IconSize size : IconSize.values()) {
// add icon
this.awtIcons.get(icon.ordinal())
.add(Toolkit.getDefaultToolkit().getImage(ClassLoader
.getSystemResource("org/jskat/gui/img/gui/"
// $NON-NLS-1$
+ icon.toString().toLowerCase() + '_'
+ size.toString().toLowerCase()
+ ".png"))); //$NON-NLS-1$
tracker.addImage(
this.awtIcons.get(icon.ordinal()).get(size.ordinal()),
1);
icons.get(icon).put(size, new javafx.scene.image.Image("org/jskat/gui/img/gui/" //$NON-NLS-1$
+ icon.toString().toLowerCase() + '_' + size.toString().toLowerCase() + ".png")); //$NON-NLS-1$
}
}
try {
tracker.waitForID(1);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
/**
* Load all card images
*
* @param cardFace
* The directory name for the card set to be loaded
*/
private void loadCards(final MediaTracker tracker) {
this.cards.clear();
for (final CardSet set : CardSet.values()) {
this.cards.put(set, new HashMap<Card, Image>());
for (final Card card : Card.values()) {
this.cards.get(set).put(card,
Toolkit.getDefaultToolkit()
.getImage(ClassLoader.getSystemResource("org/jskat/gui/img/card/" //$NON-NLS-1$
+ set.getCardFace().toString().toLowerCase() + "/" //$NON-NLS-1$
+ getCardSetNameInLowerCase(set) + "/" + card.getSuit().shortString() + '-' //$NON-NLS-1$
+ card.getRank().shortString() + "." + set.getFileType())));
tracker.addImage(this.cards.get(set).get(card), 2);
}
this.cardBacks.put(set, Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(
"org/jskat/gui/img/card/back/" + getCardSetNameInLowerCase(set) + "." + set.getFileType()))); //$NON-NLS-1$
tracker.addImage(this.cardBacks.get(set), 2);
}
try {
tracker.waitForID(2);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
private String getCardSetNameInLowerCase(final CardSet set) {
return set.getName().toLowerCase().replace(" ", "");
}
/**
* Gets an icon image
*
* @param icon
* Icon name
* @param size
* Icon size
* @return The icon image
*/
public Image getIconImage(final Icon icon, final IconSize size) {
return awtIcons.get(icon.ordinal()).get(size.ordinal());
}
/**
* Gets an icon image
*
* @param icon
* Icon
* @param size
* Size
* @return Icon image
*/
public ImageView getImageView(final Icon icon, final IconSize size) {
return new ImageView(icons.get(icon).get(size));
}
/**
* Gets the card image
*
* @param card
* Card
* @return The card image
*/
public Image getCardImage(final Card card) {
Image result = null;
if (card != null) {
result = this.cards.get(options.getCardSet()).get(card);
} else {
result = this.cardBacks.get(CardSet.ISS_GERMAN);
}
return result;
}
/**
* Gets a flag image
*
* @param flag
* Flag
* @return Flag image
*/
public Image getFlagImage(final Flag flag) {
return this.flags.get(flag.ordinal());
}
/**
* Gets the image for the skat table
*
* @return The image for the skat table
*/
public Image getSkatTableImage() {
return this.skatTable;
}
/**
* Gets the image for the JSkat logo
*
* @return The image for the JSkat logo
*/
public Image getJSkatLogoImage() {
return this.jskatLogo;
}
public javafx.scene.image.Image getJSkatLogoImageFX() {
return new javafx.scene.image.Image(getClass().getResourceAsStream("/org/jskat/gui/img/gui/jskat_logo.png"));
}
/**
* Gets the image for the left opponent bid bubble
*
* @return Image for the left opponent bid bubble
*/
public Image getLeftBidBubble() {
return this.bidBubbles.get(0);
}
/**
* Gets the image for the right opponent bid bubble
*
* @return Image for the right opponent bid bubble
*/
public Image getRightBidBubble() {
return this.bidBubbles.get(1);
}
/**
* Gets the image for the user bid bubble
*
* @return Image for the user bid bubble
*/
public Image getUserBidBubble() {
return this.bidBubbles.get(2);
}
/**
* Holds all icon types
*/
public enum Icon {
/**
* About
*/
ABOUT,
/**
* Blank
*/
BLANK,
/**
* Exit
*/
EXIT,
/**
* Help
*/
HELP,
/**
* New skat round
*/
NEW,
/**
* Load skat round
*/
LOAD,
/**
* Save
*/
SAVE,
/**
* Save under new name
*/
SAVE_AS,
/**
* First
*/
FIRST,
/**
* Previous
*/
PREVIOUS,
/**
* Next
*/
NEXT,
/**
* Last
*/
LAST,
/**
* Preferences
*/
PREFERENCES,
/**
* Table
*/
TABLE,
/**
* Start series / continue series etc.
*/
PLAY,
/**
* Pause series
*/
PAUSE,
/**
* Connect ISS
*/
CONNECT_ISS,
/**
* Leave table / log out from ISS
*/
LOG_OUT,
/**
* License
*/
LICENSE,
/**
* Close icon for windows and tabs
*/
CLOSE,
/**
* JSkat logo
*/
JSKAT,
/**
* Train Neural Networks
*/
TRAIN_NN,
/**
* OK / Bid / Hold bid
*/
OK,
/**
* Cancel / Pass
*/
STOP,
/**
* Chat
*/
CHAT,
/**
* Chat disabled
*/
CHAT_DISABLED,
/**
* User info
*/
USER_INFO,
/**
* Web / Home page
*/
WEB,
/**
* Clock
*/
CLOCK,
/**
* Invite
*/
INVITE,
/**
* Register
*/
REGISTER,
/**
* White flag
*/
WHITE_FLAG,
/**
* Undo
*/
UNDO,
/**
* REDO
*/
REDO,
/**
* Thinking icon
*/
THINKING;
}
/**
* Holds all icon sizes
*/
public enum IconSize {
/**
* Big
*/
BIG {
@Override
public String getSize() {
return "48"; //$NON-NLS-1$
}
},
/**
* Small
*/
SMALL {
@Override
public String getSize() {
return "22"; //$NON-NLS-1$
}
};
/**
* Gets a string representing the size of the icon
*
* @return Size string
*/
public abstract String getSize();
}
/**
* Enumeration for flag symbols
*/
public enum Flag {
GERMAN, ENGLISH, FRENCH, SPANISH, POLISH, CZECH;
private final JSkatResourceBundle strings = JSkatResourceBundle.INSTANCE;
/**
* Gets a flag from a character
*
* @param languageChar
* Character
* @return Flag
*/
public static Flag valueOf(final char languageChar) {
Flag result = null;
switch (languageChar) {
case 'D':
result = GERMAN;
break;
case 'E':
result = ENGLISH;
break;
case 'F':
result = FRENCH;
break;
case 'S':
result = SPANISH;
break;
case 'P':
result = POLISH;
break;
case 'C':
result = CZECH;
break;
}
return result;
}
/**
* Gets the language for a flag
*
* @return Language
*/
public String getLanguageForFlag() {
String result = null;
switch (this) {
case GERMAN:
result = this.strings.getString("german"); //$NON-NLS-1$
break;
case ENGLISH:
result = this.strings.getString("english"); //$NON-NLS-1$
break;
case FRENCH:
result = this.strings.getString("french"); //$NON-NLS-1$
break;
case SPANISH:
result = this.strings.getString("spanish"); //$NON-NLS-1$
break;
case POLISH:
result = this.strings.getString("polish"); //$NON-NLS-1$
break;
case CZECH:
result = this.strings.getString("czech"); //$NON-NLS-1$
break;
}
return result;
}
}
}